package com.ttbj.product.api;

import com.ttbj.core.util.CurrencyUtils;
import com.ttbj.product.bean.dto.BillCostDto;
import com.ttbj.product.bean.dto.OrderDto;
import com.ttbj.util.Assert;

/**
 * 费用计算接口 搬家费预估 运费预估 运费计算 搬家费计算
 * 
 * @author Administrator
 *
 */
public interface CostFacade {

	/**
	 * 运费计费
	 * 
	 * @return
	 */
	Float getFreightCost(OrderDto orderDto) throws Exception;

	/**
	 * 搬家计费
	 * 
	 * @param billType
	 *            计费类型 1 距离计费 2 按件数计费 3 按次计费
	 * @param senderLat
	 *            搬出地维度
	 * @param senderLng
	 *            搬出地经度
	 * @param reciverLat
	 *            搬入地维度
	 * @param reciverLng
	 *            搬入地经度
	 * @param floorNum
	 *            楼层数
	 * @param pieceNum
	 *            件数
	 * @param baleNum
	 *            打包数
	 * @param truckType
	 *            货车类型
	 * @param serciveLevel
	 *            服务类型
	 * @return
	 * @throws Exception
	 */
	Float getMoveCost(Integer billType, String senderLat, String senderLng, String reciverLat, String reciverLng, Integer floorNum, Integer pieceNum, Integer baleNum, String truckType, Integer serciveLevel, Integer orderDriverRequire) throws Exception;

	 

	/**
	 * 搬运费
	 * 
	 * @param floorNum
	 * @return
	 * @throws Exception
	 */
	Float getCarryCost(Integer floorNum);

	/**
	 * 打包费
	 * 
	 * @param baleNum
	 * @return
	 * @throws Exception
	 */
	Float getPackCost(Integer baleNum);

	/**
	 * 搬家总费用
	 * 
	 * @param workId
	 * @param token
	 * @param orderId
	 * @param billType
	 * @param discountId
	 * @param floorNum
	 * @param pieceNum
	 * @param baleNum
	 * @param truckType
	 * @param serciveType
	 * @param orderToCarry
	 * @param orderToPack
	 * @param orderDriverRequire
	 * @param fee
	 * @param carryFee
	 * @param packFee
	 * @param senderLat
	 * @param senderLng
	 * @param reciverLat
	 * @param reciverLng
	 * @return
	 * @throws Exception
	 */
	BillCostDto totalMoveCost(Integer billType, // 计费类型
			Long discountId, // 优惠券
			Integer floorNum, // 楼层
			Integer pieceNum, // 件数
			Integer baleNum, // 打包数
			String truckType, // 车辆类型
			String serciveType, // 服务类型
			Integer orderToCarry, // 是否搬运
			Integer orderToPack, // 是否打包
			Integer orderDriverRequire, // 车辆数
			Float fee, // 用户运费费用
			Float carryFee, // 用户自定义搬运费用
			Float packFee, // 用户自定义打包费用
			String senderLat, // 收件人维度
			String senderLng, // 寄件人经度
			String reciverLat, // 收件人维度
			String reciverLng// 收件人维度
	) throws Exception;

	/**
	 * 计算搬家费用
	 * 有可能携带有运费
	 * @param fee
	 * @param carryFee
	 * @param packFee
	 * @param truckType
	 * @param serciveType
	 * @param orderDriverRequire
	 */
	default BillCostDto totalMoveCost(Float fee, // 用户运费费用
			Float carryFee, // 用户自定义搬运费用
			Float packFee, // 用户自定义打包费用
			String truckType, // 车辆类型
			String serciveType, // 服务类型
			Integer orderDriverRequire // 车辆数
	) throws Exception {
		carryFee = null == carryFee ? 0 : carryFee;
		packFee = null == packFee ? 0 : packFee;
		if ( null != fee &&  fee > 0f) {
			Float allFee = CurrencyUtils.toAfterTwo(fee + carryFee + packFee);
			return new BillCostDto(allFee, fee, packFee, carryFee);
		}
		return totalMoveCost(3, null, null, null, null, truckType, serciveType, null, null, orderDriverRequire, fee, carryFee, packFee, null, null, null, null);
	}

	 /**
	  * 预估搬家费用
	  * @param carryFee
	  * @param packFee
	  * @param truckType
	  * @param serciveType
	  * @param orderDriverRequire
	  */
	default BillCostDto totalMoveCost(Float carryFee, Float packFee, String truckType, String serciveType, Integer orderDriverRequire) throws Exception{
		 return totalMoveCost(null, carryFee, packFee, truckType, serciveType, orderDriverRequire);
	};

}
